<?php
namespace app\ice\controller;
use app\ice\controller\Wxbizdatacrypt;
use think\Loader;
use think\Db;
use org\Wechat;
use think\Cache;

class User extends Init
{
	private $UserModel;


	protected function _initialize()
	{
		parent::_initialize();
		$this->UserModel = Loader::model('User');
	}

	public function login1(){
		// $weObj = new Wechat( config('wechat_conf') );
		// $json = $weObj->getOauthAccessToken();
		// dump($json);
		// exit;
  //           if (!$json) {
  //           	return false;
  //           }
  //       $useropenid = $json['openid'];
  //       $userinfo = $weObj->getUserInfo ( $useropenid );
  //       $wechat_info = $this->IndexModel->getUserInfo ( $useropenid );
  //       if($wechat_info){
  //       	return ['data' => [], 'code' => 200, 'message' => '已经到底了哦', 'status' => true ];
  //       }

  //       return ['data' => [], 'code' => 400, 'message' => '请注册', 'status' => true ];
        // return $json;
		// dump($userinfo);
		// exit;
        $code = input('get.code');
        $appid= 'wxa20052cca5271e47';
        $secret= 'e66c2c6abc2502832a62e4bbb3e708d6';
        $url = 'https://api.weixin.qq.com/sns/jscode2session?appid='.$appid.'&secret='.$secret.'&js_code='.$code.'&grant_type=authorization_code';
        $authname = 'wechat_session_key'.$appid;
        $result = http_get($url);
        if ($result)
        {
            $json = json_decode($result,true);
            if (!$json || isset($json['errcode'])) {
                $errCode = $json['errcode'];
                $errMsg = $json['errmsg'];
                return false;
            }
            $session_key = $json['session_key'];
            $expire = $json['expires_in'] ? intval($json['expires_in'])-100 : 3600;
            $userInfo = $this->UserModel->getUserInfo($json['openid']);
            if(!$userInfo){
                $this->UserModel->openid = $json['openid'];
                $this->UserModel->save();
            }
            Cache::set($authname,$session_key,$expire);
            return $json;
        }
        return false;
    }


    public function login() {
	    /**
	     * 3.小程序调用server获取token接口, 传入code, rawData, signature, encryptData.
	     */
	    $code = input("code", '', 'htmlspecialchars_decode');
	    $rawData = input("rawData", '', 'htmlspecialchars_decode');
	    $signature = input("signature", '', 'htmlspecialchars_decode');
	    $encryptedData = input("encryptedData", '', 'htmlspecialchars_decode');
	    $iv = input("iv", '', 'htmlspecialchars_decode');

	    /**
	     * 4.server调用微信提供的jsoncode2session接口获取openid, session_key, 调用失败应给予客户端反馈
	     * , 微信侧返回错误则可判断为恶意请求, 可以不返回. 微信文档链接
	     * 这是一个 HTTP 接口，开发者服务器使用登录凭证 code 获取 session_key 和 openid。其中 session_key 是对用户数据进行加密签名的密钥。
	     * 为了自身应用安全，session_key 不应该在网络上传输。
	     * 接口地址："https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code"
	     */
	    $this->url = 'https://api.weixin.qq.com/sns/jscode2session';
	    $params = [
	        'appid' => $this->appid,
	        'secret' => $this->secret,
	        'js_code' => $code,
	        'grant_type' => $this->grant_type
	    ];
	    $res = makeRequest($this->url, $params);
	    if ($res['code'] !== 200 || !isset($res['result']) || !isset($res['result'])) {
	        return json(ret_message('requestTokenFailed'));
	    }
	    $reqData = json_decode($res['result'], true);
	    if (!isset($reqData['session_key'])) {
	        return json(ret_message('requestTokenFailed'));
	    }
	    $sessionKey = $reqData['session_key'];

	    /**
	     * 5.server计算signature, 并与小程序传入的signature比较, 校验signature的合法性, 不匹配则返回signature不匹配的错误. 不匹配的场景可判断为恶意请求, 可以不返回.
	     * 通过调用接口（如 wx.getUserInfo）获取敏感数据时，接口会同时返回 rawData、signature，其中 signature = sha1( rawData + session_key )
	     *
	     * 将 signature、rawData、以及用户登录态发送给开发者服务器，开发者在数据库中找到该用户对应的 session-key
	     * ，使用相同的算法计算出签名 signature2 ，比对 signature 与 signature2 即可校验数据的可信度。
	     */
	    $signature2 = sha1($rawData . $sessionKey);

	    if ($signature2 !== $signature) return ret_message("signNotMatch");

	    /**
	     *
	     * 6.使用第4步返回的session_key解密encryptData, 将解得的信息与rawData中信息进行比较, 需要完全匹配,
	     * 解得的信息中也包括openid, 也需要与第4步返回的openid匹配. 解密失败或不匹配应该返回客户相应错误.
	     * （使用官方提供的方法即可）
	     */
	    $pc = new WXBizDataCrypt($this->appid, $sessionKey);
	    $errCode = $pc->decryptData($encryptedData, $iv, $data );

	    if ($errCode !== 0) {
	        return json(ret_message("encryptDataNotMatch"));
	    }
	    /**
	     * 7.生成第三方3rd_session，用于第三方服务器和小程序之间做登录态校验。为了保证安全性，3rd_session应该满足：
	     * a.长度足够长。建议有2^128种组合，即长度为16B
	     * b.避免使用srand（当前时间）然后rand()的方法，而是采用操作系统提供的真正随机数机制，比如Linux下面读取/dev/urandom设备
	     * c.设置一定有效时间，对于过期的3rd_session视为不合法
	     *
	     * 以 $session3rd 为key，sessionKey+openId为value，写入memcached
	     */
	    $data = json_decode($data, true);
	    $session3rd = randomFromDev(16);

	    $data['token'] = $session3rd;
	    cache($session3rd, $data['openId'] . $sessionKey);
        $userInfo = $this->UserModel->getUserInfo($data['openId']);
        $datas = array (
          	'openid' => $data ['openId'],
          	'nickname' => $data ['nickName'],
          	'sex' => $data ['gender'],
          	'language' => $data ['language'],
          	'city' => $data ['city'],
          	'province' => $data ['province'],
          	'country' => $data ['country'],
          	'haedimgurl' => $data ['avatarUrl'],
          	'intime' => time(),
        );
        if(empty($userInfo)){
        	$this->UserModel->data($datas);
        	$this->UserModel->save();
        	$uid = $this->UserModel->id;
        }else{
        	$this->UserModel->save($datas, ['id' => $userInfo['id']]);
        	$uid = $userInfo['id'];
        }
	    return json(['code'=>200,'token'=>$data['token'],'uid'=>$uid]);
	}

	public function bindMobile(){
	    $encryptedData = input("encryptedData", '', 'htmlspecialchars_decode');
	    $iv = input("iv", '', 'htmlspecialchars_decode');
	    $token = input("token");
	    $uid = input("uid");
	    $session3rd = cache($token);
	    $userInfo = $this->UserModel->getUserData(['uid'=>$uid]);
	    $sessionKey =  str_replace($userInfo['openid'], '', $session3rd);
	    $pc = new WXBizDataCrypt($this->appid, $sessionKey);
	    $errCode = $pc->decryptData($encryptedData, $iv, $data );
	    if ($errCode !== 0) {
	        return json(ret_message("encryptDataNotMatch"));
	    }
	    /**
	     * 7.生成第三方3rd_session，用于第三方服务器和小程序之间做登录态校验。为了保证安全性，3rd_session应该满足：
	     * a.长度足够长。建议有2^128种组合，即长度为16B
	     * b.避免使用srand（当前时间）然后rand()的方法，而是采用操作系统提供的真正随机数机制，比如Linux下面读取/dev/urandom设备
	     * c.设置一定有效时间，对于过期的3rd_session视为不合法
	     *
	     * 以 $session3rd 为key，sessionKey+openId为value，写入memcached
	     */
	    $data = json_decode($data, true);
        $this->UserModel->save(['mobile'=>$data['phoneNumber']], ['id' => $uid]);
		return ['data' => [], 'code' => 200, 'message' => '绑定成功', 'status' => true];
	}
    public function register(){
    	$param = input('post.');
    	// dump($param);
    }

	//获取商户详情
	public function detail(){
		$param = input('post.');
		// $result = $this->validate($param, 'SellerValidate.seller');
		// 	if (true !== $result) {
		// 		return ['code'=>400,'message'=>$result,'data'=>[],'status'=>false];
		// 	}
		$data = $this->UserModel->getUserData($param);
		return ['data' => $data, 'code' => 200, 'message' => '列表显示成功', 'status' => true];
	}
}